(function ($, undefined) {
	$.mkui = $.mkui || {};
	if ($.mkui.version) {
		return ;
	}
	
	$.extend($.mkui, {
		version: '0.0.1',
		
		keyCode: {
			ALT: 18,
			BACKSPACE: 8,
			CAPS_LOCK: 20,
			COMMA: 188,
			COMMAND: 91,
			COMMAND_LEFT: 91, // COMMAND
			COMMAND_RIGHT: 93,
			CONTROL: 17,
			DELETE: 46,
			DOWN: 40,
			END: 35,
			ENTER: 13,
			ESCAPE: 27,
			HOME: 36,
			INSERT: 45,
			LEFT: 37,
			MENU: 93, // COMMAND_RIGHT
			NUMPAD_ADD: 107,
			NUMPAD_DECIMAL: 110,
			NUMPAD_DIVIDE: 111,
			NUMPAD_ENTER: 108,
			NUMPAD_MULTIPLY: 106,
			NUMPAD_SUBTRACT: 109,
			PAGE_DOWN: 34,
			PAGE_UP: 33,
			PERIOD: 190,
			RIGHT: 39,
			SHIFT: 16,
			SPACE: 32,
			TAB: 9,
			UP: 38,
			WINDOWS: 91 // COMMAND
		}
	});
	
	$.fn.extend({
		prop_attr: $.fn.prop || $.fn.attr,
		
		_focus: $.fn.focus,
		focus: function(delay, fn) {
			return typeof delay === 'number' ?
				this.each(function() {
					var elem = this;
					setTimeout(function() {
						$(elem).focus();
						if (fn) {
							fn.call(elem);
						}
					}, delay);
				}) : this._focus.apply(this, arguments);
		},
		
		scrollParent: function() {
			var scrollParent;
			if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
				scrollParent = this.parents().filter(function() {
					return (/(relative|absolute|fixed)/).test($.curCSS(this, 'position', 1)) && (/(auto|scroll)/).test($.curCSS(this, 'overflow', 1) 
						+ $.curCSS(this, 'overflow-y', 1) + $.curCSS(this, 'overflow-x', 1));
				}).eq(0);
			} else {
				scrollParent = this.parents().filter(function() {
					return (/(auto|scroll)/).test($.curCSS(this, 'overflow', 1) + $.curCSS(this, 'overflow-y', 1) + $.curCSS(this, 'overflow-x', 1));
				}).eq(0);
			}
			
			return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
		}, 
		
		zIndex: function(zIndex) {
			if (zIndex !== undefined) {
				return this.css('zIndex', zIndex);
			}
			
			if (this.length) {
				var elem = $(this[0]), position, value;
				while (elem.length && elem[0] !== document) {
					position = elem.css('position');
					if (position === 'absolute' || position === 'relative' || position === 'fixed') {
						value = parseInt(elem.css('zIndex'), 10);
						if (!isNaN(value) && value !== 0) {
							return value;
						}
					}
					elem = elem.parent();
				}
			}
			
			return 0;
		},
		
		disableSelection: function() {
			return this.bind(($.support.selectstart ? 'selectstart' : 'mousedown') + '.mkui-disable-selection', function(event) {
				event.preventDefault;
			});
		},
		
		enableSelection: function() {
			return this.unbind('.mkui-disable-selection');
		}
	});
	
	$.extend($.mkui, {
		plugin: {
			add: function(module, option, set) {
				var proto = $.mkui[module].prototype;
				for (var i in set) {
					proto.plugins[i] = proto.plugins[i] || []; // 如果prooto中原来有值，则不变，否则设置为空数组
					proto.plugins[i].push([option, set[i]]); // 
				}
			},
			
			call: function(instance, name, args) {
				var set = instance.plugins[name];
				if (!set || !instance.element[0].parentNode) {
					return;
				}
				
				for (var i = 0; i < set.length; i++) {
					if (instance.options[set[i][0]]) {
						set[i][1].apply(instance.element, args);
					}
				}
			}
		}
	});
})(jQuery);
